package Gather.DataStructure;

/**
 * ClassName:Tree002
 * Package:Gather.DataStructure
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/8-19:02
 * @Version:v1.0
 */
public class Tree002 {
    /*
    * 红黑树：红黑树是一种自平衡的二叉查找树,是计算机科学院中用到的一种数据结构
    * 1972年出现,当时被称之为平衡二叉B树,后来,1978年被修改为如今的"红黑树"
    * 它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示结点的颜色
    * 每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的
    *
    * 平衡二叉树
    * 1.高度平衡
    * 2.当左右子树高度差超过1时,通过旋转保持平衡
    *
    * 红黑树
    * 1.是一个二叉查找树
    * 2.但是不是高度平衡
    * 3.条件：特有的红黑规则
    *
    * 红黑规则
    * 1.每一个节点或是红色的,或者是黑色的
    * 2.根节点必须是黑色的
    * 3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点都是黑色的
    * 4.如果某一个节点是红色,那么它的子节点必须是黑色的(不能出现两个红色节点相连的情况)
    * 5.对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
    *
    * 添加节点的规则：
    * 默认颜色：添加节点默认是红色的(效率高)
    *
    * 添加节点
    * 根----->直接变为黑色
    * 非根
    *       1.父黑色---->则不需要任何操作
    *       2.父红色
    *         1.叔叔红色
    *             a.将父设为黑色,将叔叔设为黑色
    *             b.将祖父设为红色
    *             c.如果祖父为根,再将根变回黑色
    *             d.如果父非根,将祖父设置为当前节点再进行其判断
    *         2.叔叔黑色(当前节点是父的右孩子)---->把父作为当前节点并左旋,再进行判断
    *         3.叔叔黑色(当前节点是父的左孩子)
    *             a.将父设为黑色
    *             b.将祖父变为红色
    *             c.以祖父为支点进行右旋
    *
    * 红黑树增删改查的性能都很好*/
}
